#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=100010;
struct edge
{
	int x,y,id;
}e[maxn];
int c[maxn],ans[maxn];
int n,s;
bool cmp(edge a,edge b)
{
	if(a.x==b.x)return a.y>b.y;
	return a.x<b.x;
}
int max(int x,int y)
{
	return x>y?x:y;
}
int low(int i)
{
	return i&(i^(i-1));
}
void add(int i,int v)
{
	while(i<=s)
	{
		c[i]+=v;
		i+=low(i);
	}
}
int sum(int x)
{
	int ans=0;
	while(x>0)
	{
		ans+=c[x];
		x-=low(x);
	}
	return ans;
}
int main()
{
	freopen("test.in","r",stdin);
	while(scanf("%d",&n)&&n)
	{
		s=-1;
		for(int i=1;i<=n;i++)
		{
			scanf("%d%d",&e[i].x,&e[i].y);
			e[i].id=i;
			e[i].x++;
			e[i].y++;
			s=max(s,e[i].y);
		}
		sort(e+1,e+n+1,cmp);
		memset(c,0,sizeof(c));
		memset(ans,0,sizeof(ans));
		add(e[1].y,1);
		ans[e[1].id]=0;
		for(int i=2;i<=n;i++)
		{
			if(e[i].x==e[i-1].x&&e[i].y==e[i-1].y)
			{
				ans[e[i].id]=ans[e[i-1].id];
				add(e[i].y,1);
				continue;
			}
			ans[e[i].id]=sum(s)-sum(e[i].y-1);
			add(e[i].y,1);
		}
		for(int i=1;i<n;i++)
			printf("%d ",ans[i]);
		printf("%d\n",ans[n]);
	}
	return 0;
}		
